﻿#pragma once

#include <string>
#include <string_view>
#include <vector>
#include <Windows.h>

/**
 * @namespace StringUtils
 * @brief 字符串编码处理工具命名空间
 *
 * 提供多种编码格式的检测和转换功能。
 * 支持 UTF-8、GBK、UTF-16、wchar_t 的编码验证与互转。
 *
 * 主要功能：
 *   - 编码检测：判断字符串或数据是否为指定编码格式。
 *   - 编码转换：不同编码之间的高效转换，全部基于 Windows API。
 *
 * 用法示例：
 *   bool valid = StringUtils::IsValidUTF8("测试字符串");
 *   std::string utf8 = StringUtils::GBKToUTF8("GBK字符串");
 *   std::wstring wide = StringUtils::UTF8ToWideChar(u8"utf8字符串");
 */

namespace StringUtils {

    /************************** 编码检测 **************************/
    // UTF-8 系列
    bool IsValidUTF8(const uint8_t* data, size_t size);
    bool IsValidUTF8(std::string_view sv);
    bool IsValidUTF8(std::basic_string_view<uint8_t> sv);
    bool IsValidUTF8(const char* str);
    bool IsValidUTF8(const std::vector<uint8_t>& data);

    // GBK 系列
    bool IsValidGBK(const uint8_t* data, size_t size);
    bool IsValidGBK(std::string_view sv);
    bool IsValidGBK(std::basic_string_view<uint8_t> sv);
    bool IsValidGBK(const char* str);
    bool IsValidGBK(const std::vector<uint8_t>& data);

    // UTF-16 系列 (char16_t)
    bool IsValidUTF16(const char16_t* data, size_t size);
    bool IsValidUTF16(std::u16string_view sv);
    bool IsValidUTF16(const std::vector<char16_t>& data);

    // wchar_t 系列 (Windows专用)
    bool IsValidWideChar(const wchar_t* data, size_t size);
    bool IsValidWideChar(std::wstring_view sv);
    bool IsValidWideChar(const std::vector<wchar_t>& data);

    /************************** 编码转换 **************************/
    // GBK → UTF-8
    std::string GBKToUTF8(const uint8_t* data, size_t size);
    std::string GBKToUTF8(std::string_view sv);
    std::string GBKToUTF8(std::basic_string_view<uint8_t> sv);
    std::string GBKToUTF8(const char* str);
    std::string GBKToUTF8(const std::vector<uint8_t>& data);

    // UTF-8 → GBK
    std::string UTF8ToGBK(const uint8_t* data, size_t size);
    std::string UTF8ToGBK(std::string_view sv);
    std::string UTF8ToGBK(std::basic_string_view<uint8_t> sv);
    std::string UTF8ToGBK(const char* str);
    std::string UTF8ToGBK(const std::vector<uint8_t>& data);

    // UTF-16 → UTF-8
    std::string UTF16ToUTF8(const char16_t* data, size_t size);
    std::string UTF16ToUTF8(std::u16string_view sv);
    std::string UTF16ToUTF8(const std::vector<char16_t>& data);

    // UTF-8 → UTF-16
    std::u16string UTF8ToUTF16(const uint8_t* data, size_t size);
    std::u16string UTF8ToUTF16(std::string_view sv);
    std::u16string UTF8ToUTF16(std::basic_string_view<uint8_t> sv);
    std::u16string UTF8ToUTF16(const char* str);
    std::u16string UTF8ToUTF16(const std::vector<uint8_t>& data);

    // wchar_t → UTF-8
    std::string WideCharToUTF8(const wchar_t* data, size_t size);
    std::string WideCharToUTF8(std::wstring_view sv);
    std::string WideCharToUTF8(const std::vector<wchar_t>& data);

    // UTF-8 → wchar_t
    std::wstring UTF8ToWideChar(const uint8_t* data, size_t size);
    std::wstring UTF8ToWideChar(std::string_view sv);
    std::wstring UTF8ToWideChar(std::basic_string_view<uint8_t> sv);
    std::wstring UTF8ToWideChar(const char* str);
    std::wstring UTF8ToWideChar(const std::vector<uint8_t>& data);
}
